/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
/* Klasa koja simulira rad racunara koji komuniciraju. */
package tos.trizice;

import org.jdesktop.application.FrameView;
import tos.TosView;

/**
 *
 * @author Milos
 */
public class Racunar extends Thread
{
    boolean funkcija; // Promenljiva koja oznacava da li racunar salje ili prima podatke
    char [] podaci; // Niz sa podacima za slanje ili primanje
    Zice z; // Zice za komunikaciju
    int iPrimaj; // Promenljiva za pristup clanovima niza u koji se upisuju primljeni podaci
    
    FrameView parent;

    // Konstruktor
    public Racunar(boolean funkcija, char [] podaci, Zice z, FrameView parent) {
        this.funkcija = funkcija;
        this.podaci = podaci;
        this.z = z;
        this.parent = parent;
    }

    // Geteri i seteri
    public boolean isFunkcija() {
        return funkcija;
    }

    public void setFunkcija(boolean funkcija) {
        this.funkcija = funkcija;
    }

    public char[] getPodaci() {
        return podaci;
    }

    public void setPodaci(char[] podaci) {
        this.podaci = podaci;
    }

    public Zice getZ() {
        return z;
    }

    public void setZ(Zice z) {
        this.z = z;
    }

    // Run metoda koja poziva metodu za slanje ili metodu za primanje 
    // u zavisnosti od funkcije racunara
    @Override
    public void run ()
    {
        if (funkcija) // Ako je ova promenjiva true, racunar ima ulogu posaljioca
        {
            // petlja koja se ponavlja onoliko puta koliko ima slova
            for (int i = 0; i < podaci.length; i++) 
            {
                salji (i); // Metoda za slanje jednog podatka (slova)
                try
                {
                    sleep (1000); // Dodato samo radi ilustracije
                }catch (InterruptedException iEx)
                {
                    System.out.println ("Izuzetak " + iEx.toString());
                }
            }
        }
        else
        {  iPrimaj = 0;
           while (true)
           {
                primaj (); // Metoda za primanje jednog podatka (slova)
                try
                {
                    sleep (500); // Dodato samo radi ilustracije
                }catch (InterruptedException iEx)
                {
                    System.out.println ("Izuzetak " + iEx.toString());
                }
                iPrimaj++;
            }
        }
    }

    // Metoda za slanje jednog podatka (slova) koja kao parametar prihvata
    // redni broj podatka u nizu za slanje
    private void salji (int i)
    {
        // Algoritam za slanje jednog podatka
        z.setPodatak(podaci[i]);
        System.out.println ("Poslao: " + podaci [i]);
        ((TosView)parent).appendOutput("Poslao: " + podaci [i] + "\n");
        z.setA(true);    
        while (!z.isB());
        z.setA(false);
        while (z.isB());
    }

    // Metoda za primanje jednog podatka (sloava) koja kao parametar prihvata
    // redni broj podatka u nizu za primanje
    private void primaj ()
    {
        // Algoritam za primanje jednog podatka
        while (!z.isA());
        podaci[iPrimaj] = z.getPodatak();
        System.out.println ("Primio: " + podaci [iPrimaj]);
        ((TosView)parent).appendOutput("Primio: " + podaci[iPrimaj] + "\n");
        z.setB(true);
        while (z.isA());
        z.setB(false);
    }

    // Metoda koja ispisuje niz sa podacima
    public void ispisi ()
    {
        for (int i = 0; i < podaci.length; i++)
        {
            System.out.print ("" + podaci [i]);
            ((TosView)parent).appendOutput("" + podaci[i]);
        }
        System.out.println ("");
        ((TosView)parent).appendOutput("\n");
    }

}
